www.gusucode.com > VC++ 密码探测器 > VC++ 密码探测器/gusucode/PwdSpyHk/IPC.cpp

    #include <windows.h>
#include <tchar.h>
#include <crtdbg.h>

#include "IPC.h"

//***********************************************
CIPC::CIPC() : m_hFileMap(NULL), m_hMutex(NULL)
{
}

//***********************************************
CIPC::~CIPC()
{
	CloseIPCMMF();
	Unlock();
}

//***********************************************
bool CIPC::CreateIPCMMF(void)
{
	bool bCreated = false;

	try
	{
		if(m_hFileMap != NULL)
			return false;	// Already created

		// 创建4k的内存映射文件
		m_hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF,
			NULL,
			PAGE_READWRITE,
			0,
			4096,
			IPC_SHARED_MMF);
		if(m_hFileMap != NULL)
			bCreated = true;
	}
	catch(...) {}

	return bCreated;
}

//***********************************************
bool CIPC::OpenIPCMMF(void)
{
	bool bOpened = false;

	try
	{
		if(m_hFileMap != NULL)
			return true;	// Already opened
        //打开内存映射文件
		m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
			FALSE,
			IPC_SHARED_MMF);
		if(m_hFileMap != NULL)
			bOpened = true;
	}
	catch(...) {}

	return bOpened;
}

//***********************************************
void CIPC::CloseIPCMMF(void)
{
	try
	{
		if(m_hFileMap != NULL)
			CloseHandle(m_hFileMap), m_hFileMap = NULL;
	}
	catch(...) {}
}

//***********************************************
bool CIPC::ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize)
{
	_ASSERTE(pBuf);

	bool bSuccess = true;

	try
	{
		if(m_hFileMap == NULL)
			return false;
        //将内存映射文件映射到本进程地址空间
		DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap,
			FILE_MAP_READ | FILE_MAP_WRITE,
			0, 0, 0);
		_ASSERTE(dwBaseMMF);

		// 读取共享数据
		DWORD dwSizeofInBuf = dwBufSize;
		CopyMemory(&dwBufSize, (LPVOID)dwBaseMMF, sizeof(DWORD));

		if(dwSizeofInBuf != 0)
		{
			if(dwBufSize > dwSizeofInBuf)
				bSuccess = false;
			else
				CopyMemory(pBuf, (LPVOID)(dwBaseMMF + sizeof(DWORD)), dwBufSize);
		}
        //解除本进程地址映射
		UnmapViewOfFile((LPVOID)dwBaseMMF);
	}
	catch(...) {}

	return bSuccess;
}

//***********************************************
bool CIPC::WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize)
{
	_ASSERTE(pBuf);

	bool bSuccess = true;

	try
	{
		if(m_hFileMap == NULL)
			return false;
        //将内存映射文件映射到本进程地址空间
		DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap,
			FILE_MAP_READ | FILE_MAP_WRITE,
			0, 0, 0);
		_ASSERTE(dwBaseMMF);

		// 向共享区域写入数据
		CopyMemory((LPVOID)dwBaseMMF, &dwBufSize, sizeof(DWORD));
		CopyMemory((LPVOID)(dwBaseMMF + sizeof(DWORD)), pBuf, dwBufSize);

		UnmapViewOfFile((LPVOID)dwBaseMMF);
	}
	catch(...) {}

	return bSuccess;
}

//***********************************************
bool CIPC::Lock(void)
{
	bool bLocked = false;

	try
	{
		// 得到互斥体的句柄
		m_hMutex = CreateMutex(NULL, FALSE, IPC_MUTEX);
		if(m_hMutex != NULL)
		{
			// 等待锁住
			if(WaitForSingleObject(m_hMutex, INFINITE) == WAIT_OBJECT_0)
				bLocked = true;
		}
	}
	catch(...) {}

	return bLocked;
}

//***********************************************
void CIPC::Unlock(void)
{
	try
	{
		if(m_hMutex != NULL)
		{
			ReleaseMutex(m_hMutex); //解锁
			CloseHandle(m_hMutex);
			m_hMutex = NULL;
		}
	}
	catch(...) {}
}